home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 221_01 / peephole.c < prev    next >
Text File  |  1980-01-01  |  16KB  |  784 lines

  1. /*#define VAX*/
  2. #define PHASE2
  3. /*#define PHASE3*/
  4. #define P15nov86
  5. #define P17nov86
  6. /*#define P18nov86*/
  7. #define P28nov86
  8. #ifdef VAX
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. #else
  12. #include stdio.h
  13. extern int fputs(), strncmp(), strncpy();
  14. #endif
  15.  
  16. #define save_line_count 20
  17. #define lin_buf_len 1600
  18. #define line 80
  19. #define opt_deps 100
  20.  
  21. /*  Peephole optimizer for 6809 code */
  22. /*  written by Dieter H. Flunkert   */
  23. /*  Written:     */
  24. /*  Version A.07 */
  25. /*    02-dec-85  */
  26. /*  Update:      */
  27. /*    01-jul-86  */
  28. /*    17-jul-86  */
  29. /*    07-nov-86  */
  30. /*    15-nov-86  */
  31. /*    17-nov-86  */
  32. /*    18-nov-86  */
  33. /*    28-nov-86  */
  34.  
  35. /* Global variables    */
  36. char new_table[] = "EQNELEGELTGTHIHSLSLO";
  37. char jump_table[] = "NEEQGTLTGELELSLOHIHS";
  38. char number[] = " LB   ";
  39. #ifdef VAX
  40. FILE *ifp, *ofp;
  41. #else
  42. int ofp, ifp;
  43. #endif
  44. char buffer[line];
  45. char save_buffer[lin_buf_len];
  46. char save_jump[line];
  47. char num_1[line];
  48. char num_2[line];
  49. #ifdef P18nov86
  50. int opt_level, wr_ok;
  51. #endif
  52. int opt_end, opt_id, bp;
  53.  
  54. /* for stand alone  */
  55.  
  56. /* #define EOF -1  */
  57. /* #define NULL 0  */
  58. /* #define EOL 13  */
  59.  
  60. #define jump7 "*+7\n"
  61. #define jump5 " BRA  *+5\n"
  62. #define kommas ",S\n"
  63. #define ldd " LDD  "
  64. #define lddnum " LDD  #"
  65. #define ldd0 " LDD  #0\n"
  66. #define ldd1 " LDD  #1\n"
  67. #define pulsd " PULS D\n"
  68. #define pshsd " PSHS D\n"
  69. #define pshsy " PSHS Y\n"
  70. #define pulsx " PULS X\n"
  71. #define pshsx " PSHS X\n"
  72. #define tfryd " TFR  Y,D\n"
  73. #define addd " ADDD "
  74. #define addd1 " ADDD #1\n"
  75. #define adddsplus " ADDD ,S++\n"
  76. #define coma " COMA\n"
  77. #define comb " COMB\n"
  78. #define subd " SUBD "
  79. #define stb " STB  "
  80. #define ldb " LDB  "
  81. #define stbsplus " STB  [,S++]\n"
  82. #define ldbsplus " LDB  [,S++]\n"
  83. #define lddsplus " LDD  [,S++]\n"
  84. #define stdsplus " STD  [,S++]\n"
  85. #define stdx " STD  ,X\n"
  86. #define std " STD  "
  87. #define leay " LEAY "
  88. #define leax " LEAX "
  89. #define cmpd " CMPD "
  90. #define cmpd0 " CMPD #0\n"
  91. #define cmpdsplus " CMPD ,S++\n"
  92. #define lb " LB"
  93. #define lbeqcc " LBEQ cc"
  94. #define lbnecc " LBNE cc"
  95. #define lbsr " JSR "
  96. #define jmp " JMP "
  97.  
  98. #ifdef VAX
  99. main()
  100. #else
  101. main(argc, argv) int argc, argv[];
  102. #endif
  103. {
  104. /* i points to first free place in save buffer */
  105. /* bp points to next line to be transfered to check buffer */
  106.  
  107.  int i,j;
  108.  int opt;
  109.  
  110. #ifdef VAX
  111. init();
  112. #else
  113. init(argc,argv);
  114. #endif
  115.  opt_end = opt_id = bp = i = 0;
  116.  opt = 
  117. #ifdef P18nov86
  118.  wr_ok =
  119. #endif
  120.  1;
  121.  while(getline() != EOF) {    /* read lines until end of file */
  122.   if(i+line >= lin_buf_len) { /* buffer full? */
  123.     write_buffer();           /* write line to file */
  124.     i=m1_down();              /* move buffer down */
  125.     bp=0;                     /* reset buffer pointer */
  126.   }
  127.   i = copy_append(i);         /* copy to save buffer (append it) */
  128.   while((bp = copy_buffer(bp)) > 0) { /* copy to check buffer */
  129.     if(buffer[0] != ";") {    /* process only valid assembler code */
  130.       if(check_1(opt++) != 0) { /* check if good for optimize */
  131. #ifdef P18nov86
  132.      if(wr_ok) 
  133. #endif
  134.        write_buffer(); /* write first line of buffer to file */
  135. #ifdef P18nov86
  136.      if(!wr_ok) {
  137.        m1_down();                /* shift buffer one line */
  138.        m1_down();
  139.      }
  140. #endif
  141.      i = m1_down();  /* shift buffer one line */
  142.      opt_end = bp = 0;
  143.      opt =
  144. #ifdef P18nov86
  145.      wr_ok =
  146. #endif
  147.      1;
  148.     }
  149.     else {
  150.  
  151.  /* if good for optimize and already the last in this sequence */
  152.  /* write the optimized version and forget the rest     */
  153.  
  154.      if (opt_end < 0) {
  155.       write_opt();
  156.       opt =
  157. #ifdef P18nov86
  158.       wr_ok =
  159. #endif
  160.       1;
  161.       i = move_buffer(bp); /* move buffer down */
  162.       opt_end = opt_id = bp = 0;
  163.      }
  164.     }
  165.    }
  166.   }
  167.  }
  168.  if (save_buffer[bp] != '\0')
  169.   fputs(save_buffer[bp],ofp); /* write the rest of the save buffer */
  170.    fputs(buffer, ofp);   /* write last line */
  171. }
  172. copy_buffer(bp)
  173. /* copy line of save buffer to check buffer */
  174. int bp; /* buffer pointer of save buffer  */
  175. {
  176.  int i;
  177.  
  178.  if (bp < 0) bp = -bp;  /* use absolute value */
  179.  if (save_buffer[bp] == '\0') 
  180.     return (-bp); /* return negative value if nothing to do */
  181.  i = 0;
  182.  while((buffer[i++] = save_buffer[bp++]) != '\n') ;
  183.  buffer[i] = '\0';
  184.  return(bp);
  185. }
  186. write_buffer()
  187. /* write first line from save buffer to output file */
  188. {
  189.  copy_buffer(0);
  190.  fputs(buffer,ofp);
  191. }
  192. m1_down()
  193. /* move save buffer one line 'down'  */
  194. {
  195.  int i;
  196.  
  197.  i = 0;
  198.  while (save_buffer[i++] != '\n') ;
  199.  return(move_buffer(i));
  200. }
  201. move_buffer(bp)
  202. int bp;
  203. /* move buffer bp characters down */
  204. {
  205.  int  j;
  206.  
  207.  j = 0;
  208.  while((save_buffer[j++] = save_buffer[bp++]) != '\0') ;
  209.  return (--j);
  210. }
  211. write_opt()
  212. /* write optimize string to output file  */
  213. {
  214.  int i,len;
  215.  
  216.  i = 0;
  217.  switch(opt_id) {
  218. #ifdef PHASE2
  219.   case 1: {
  220.    fputs(num_2,ofp);
  221.    fputs(num_1,ofp);
  222.    break;
  223.    }
  224. #endif
  225.   case 2: {
  226.    fputs(leax,ofp);
  227.    fputs(num_1,ofp);
  228.    fputs(ldd,ofp);
  229.    fputs(num_2,ofp);
  230.    fputs(stdx,ofp);
  231.    break;
  232.   }
  233.   case 3: {
  234.    fputs(number,ofp);
  235.    fputs(num_2,ofp);
  236.    break;
  237.   }
  238.   case 10: {
  239.    fputs(ldd,ofp);
  240.    fputs(num_1,ofp);
  241.    break;
  242.   }
  243.   case 11: {
  244.    fputs(leay,ofp);
  245.    fputs(num_2,ofp);
  246.    fputs(pshsy,ofp);
  247.    fputs(ldd,ofp);
  248.    fputs(num_1,ofp);
  249.    break;
  250.   }
  251. #ifndef P18nov86
  252.   case 12: {
  253.    fputs(ldb,ofp);
  254.    fputs(num_2,ofp);
  255.    fputs(stb,ofp);
  256.    fputs(num_1,ofp);
  257.    break;
  258.   }
  259. #endif
  260.   case 13: {
  261.    fputs(ldd,ofp);
  262.    fputs(num_1,ofp);
  263.    fputs(subd,ofp);
  264.    fputs(num_2,ofp);
  265.    fputs(std,ofp);
  266.    fputs(num_1,ofp);
  267.    break;
  268.   }
  269.   case 14: {
  270.    fputs(ldb,ofp);
  271.    fputs(num_1,ofp);
  272.    break;
  273.   }
  274.   case 15: {
  275.    fputs(lbsr,ofp);
  276.    fputs(num_2,ofp);
  277.    fputs(std,ofp);
  278.    fputs(num_1,ofp);
  279.    break;
  280.   }
  281. #ifndef P18nov86
  282.   case 16: {
  283.    fputs(ldd,ofp);
  284.    fputs(num_2,ofp);
  285.    fputs(std,ofp);
  286.    fputs(num_1,ofp);
  287.    break;
  288.   }
  289. #endif
  290.   case 17: {
  291.    fputs(ldd,ofp);
  292.    fputs(num_1,ofp);
  293.    fputs(addd,ofp);
  294.    fputs(num_2,ofp);
  295.    fputs(std,ofp);
  296.    fputs(num_1,ofp);
  297.    break;
  298.   }
  299.  case 18:
  300.   fputs(save_jump,ofp);
  301.   fputs("8\n",ofp);
  302.   fputs(ldd0,ofp);
  303.   fputs(jmp,ofp);
  304.   fputs(num_2,ofp);
  305. /*
  306.   fputs(ldd1,ofp);
  307. */
  308.   break;
  309. #ifdef P17nov86
  310.  case 21:
  311.   fputs(lddnum,ofp);
  312.   fputs(num_1,ofp);
  313.   putc('\n',ofp);
  314.   break;
  315. #endif
  316. #ifdef P28nov86
  317.  case 22:
  318.   fputs(num_1,ofp);
  319.   fputs(num_2,ofp);
  320.   break;
  321. #endif
  322.  case 23:
  323.   fputs(num_1,ofp);
  324.   break;
  325.  case 24:
  326.   fputs(lddnum,ofp);
  327.   putc('-',ofp);
  328.   fputs(num_1,ofp);
  329.   break;
  330. #ifdef P18nov86
  331.  case 99:
  332.   fputs(num_2,ofp);
  333.   fputs(num_1,ofp);
  334.   break;
  335. #endif
  336.  default: break;
  337.  }
  338. }
  339. #ifdef VAX
  340. init()
  341. /*  get filenames and open files   */
  342. {
  343.  int i;   /* just for counting */
  344.  char infile[80]; /* file names   */
  345.  char outfile[80];
  346.  
  347.  i = 0;
  348.  fputs("\nFile to optimize? ",stdout);
  349.  while((infile[i]=getchar()) != '\n')
  350.     if(infile[i]!='\b') ++i;
  351.     else {
  352.      if(--i < 0) i = 0;
  353.      putc(' ',stdout);
  354.      putc('\b',stdout);
  355.     }
  356.  infile[i] = '\0';
  357.  if ((ifp = fopen(infile,"r")) == NULL) {
  358.   fputs("\n*** E R R O R *** opening file ",stdout);
  359.     fputs(infile,stdout);
  360.   exit(0);
  361.  }
  362.  i = 0;
  363.  fputs("\nOutput File Name? ",stdout);
  364.  while((outfile[i]=getchar()) != '\n')
  365.     if(outfile[i]!='\b') ++i;
  366.     else {
  367.      if(--i < 0) i=0;
  368.      putc(' ',stdout);
  369.      putc('\b',stdout);
  370.     }
  371.  outfile[i] = '\0';
  372.    if(outfile[0] == '\0') {
  373.     ofp = stdout;
  374.     return;
  375.    }
  376.  if ((ofp = fopen(outfile,"w")) == NULL) {
  377.   fputs("\n*** E R R O R *** opening file ",stdout);
  378.     fputs(outfile,stdout);
  379.   exit(0);
  380.  }
  381. }
  382. #else
  383. init(argc, argv) int argc, argv[]; {
  384. char *argptr;
  385. int i;
  386.   i=0;
  387.   ifp=stdin;
  388.   ofp=stdout;
  389.   if(argc==1) {
  390.     fputs("\nusage peephole <infile >outfile",stderr);
  391.     exit(0);
  392.   }
  393.   while(--argc) {
  394.     argptr=argv[++i];
  395.     if(*argptr=='<') {
  396.       if((ifp=fopen(++argptr,"r")) == 0) {
  397.          fputs("\nerror opening input file",stderr);
  398.          exit(0);
  399.        }
  400.      }
  401.      if(*argptr=='>') {
  402.        if((ofp=fopen(++argptr,"w")) == 0) {
  403.          fputs("\nerror o